package org.soderiakelvy.controller.sujeto;

import java.io.Serializable;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.soderiakelvy.controller.util.Constante;
import org.soderiakelvy.controller.util.UtilDate;
import org.soderiakelvy.model.domain.ComercializacionPackVO;
import org.soderiakelvy.model.domain.FrioCalorVO;
import org.soderiakelvy.model.domain.SucursalFrioCalorVO;
import org.soderiakelvy.model.domain.SucursalVO;
import org.soderiakelvy.model.service.ProductoServicio;
import org.soderiakelvy.model.service.SucursalServicio;
import org.soderiakelvy.model.service.imp.ProductoServicioImp;
import org.soderiakelvy.model.service.imp.SucursalServicioImp;
import org.soderiakelvy.model.util.ConstantModel;

@ManagedBean
@ViewScoped
public class SujetoEmpresaPack implements Serializable {
	private static final long serialVersionUID = 1L;	
	//--- VO & Service ---
	private SucursalVO sucursal;
	private ComercializacionPackVO comercializacionPackOld;
	private ComercializacionPackVO comercializacionPackNew;
	private FrioCalorVO selectedFrioCalor;
	
	private SucursalServicio service;
	//--------------------
	
	//--- Variables ---

	private List<FrioCalorVO> equiposFrioCalorDisponibles;
	private List<FrioCalorVO> frioCalorFilter;
	private List<ComercializacionPackVO> comercializaciones;
	private List<SucursalFrioCalorVO> equiposAsignados;
	private boolean isUpdate;
	private boolean mostrarComercializacionVieja;
	private String tipoCrud;
	private String titulo;
	private String ubicacionFrioCalor;
	
	//-----------------
	
	
	//--- CONSTRUCTOR ---
	public SujetoEmpresaPack(){
		selectedFrioCalor = new FrioCalorVO();
		equiposAsignados = new ArrayList<SucursalFrioCalorVO>();
		service = new SucursalServicioImp();
		getEquiposFCDisponibles();
		getTipoCrud();
		getComercializacionPack();
	}

	private void getTipoCrud(){
		FacesContext fc = FacesContext.getCurrentInstance();
		Map<String,Object> sessionParams = fc.getExternalContext().getSessionMap();
		tipoCrud = (String) sessionParams.get("tipoCrudComercializacionPack");
		sucursal = (SucursalVO) sessionParams.get("sucursalUpdateComercializacionPack");
		if(tipoCrud != null && sucursal != null){
			if(tipoCrud.equals(Constante.SUJETO_EMPRESA_COMERCIALIZACION_PACK_CREATE)){
				titulo = "Alta de Sujeto Empresa - Crear Comercializacion";
				isUpdate = false;
			}else {
				if(tipoCrud.equals(Constante.SUJETO_EMPRESA_COMERCIALIZACION_PACK_UPDATE)){
					titulo = "Modificacion - Modificar Comercializacion";
					isUpdate = false;
				}
			}
			fc.getExternalContext().getSessionMap().remove("tipoCrudComercializacionPack");
			fc.getExternalContext().getSessionMap().remove("sucursalUpdateComercializacionPack");
			getComercializacionPack();
		}else {
			System.out.println("Nose pudo crera la vista");
		}
	}
	
	/**
	 * Obtiene los equipos frio calor disponibles que esten en estado fabrica y no sean de agua de red
	 */
	private void getEquiposFCDisponibles(){
		ProductoServicio serviceProducto = new ProductoServicioImp();		
		equiposFrioCalorDisponibles = serviceProducto.getEquiposFrioCalorByTipoAndEstado(ConstantModel.FRIO_CALOR_NO_AGUA_DE_RED, ConstantModel.ESTADO_FRIO_CALOR.FABRICA.getEstado());
		System.out.println("Cantidad de Equipos disponibles : "+ equiposFrioCalorDisponibles.size());
	}
	//-------------------

	//--- METODOS ---
	
	private void buscarEquiposAsignados(){
		SucursalServicio ss = new SucursalServicioImp();		
		equiposAsignados = ss.getSucursalFrioCalorBySucursal(getSucursal());
	}
	
	/**
	 * Agrega un equipo de Frio Calor a la lista de equiposAsignados
	 * y elimina el frio calor de la lista de equipos disponibles
	 * 
	 */
	public void asignarFrioCalorSucursal(FrioCalorVO frioCalor){
		SucursalFrioCalorVO sfc = new SucursalFrioCalorVO();
		sfc.setFrioCalor(frioCalor);
		sfc.setSucursal(getSucursal());
		sfc.setUbicacion(getUbicacionFrioCalor());
		equiposAsignados.add(sfc);
		equiposFrioCalorDisponibles.remove(frioCalor);
		setUbicacionFrioCalor(null);		
	}
	
	/**
	 * Elimina un equipo frio calor que esta en la lista de equipos asignados
	 * y agrega el frio calor a la lista de equipos disponibles
	 * @param sucursalFrioCalor
	 */
	public void quitarFrioCarloSucursal(SucursalFrioCalorVO sucursalFrioCalor){
		equiposAsignados.remove(sucursalFrioCalor);
		equiposFrioCalorDisponibles.add(sucursalFrioCalor.getFrioCalor());
	}
	
	/**
	 * Guarda una comercializacion del tipo Pack
	 * @param sucPack
	 * @return url si todo esta ok
	 */
	public String actualizarComercializacionPack(){
		if (comercializaciones != null){
			SucursalServicio service = new SucursalServicioImp();
			for(SucursalFrioCalorVO sfc: equiposAsignados){
				System.out.println("asignar este: "+sfc.getFrioCalor().getNumeroDeSerie());
			}
			switch (comercializaciones.size()) {
			case 0:
				comercializacionPackNew.setSucursal(getSucursal());
				comercializacionPackNew.setFechaAsignacion(new Date());
				System.out.println(service.insertComercializcionPackVO(comercializacionPackNew));
				guardarFrioCalorSucursal(comercializacionPackNew.getComercializacionPackId(), Constante.COMERCIALIZACION_PACK);	
				break;
			
			case 1:
				comercializacionPackOld.setFechaDesasignacion(UtilDate.getUltimoDiaDelMes(new Date()));
				service.updateComercializcionPackVO(comercializacionPackOld);
				comercializacionPackNew.setFechaAsignacion(UtilDate.getPrimerDiaDelProximoMes(new Date()));
				comercializacionPackNew.setSucursal(getSucursal());
				service.insertComercializcionPackVO(comercializacionPackNew);
				guardarFrioCalorSucursal(comercializacionPackOld.getComercializacionPackId(), Constante.COMERCIALIZACION_PACK);
				break;

			case 2:
				for(ComercializacionPackVO cp: comercializaciones){
					if(cp.getFechaDesasignacion()== null){
						service.deleteComercializcionPackVO(cp);
						comercializacionPackNew.setFechaAsignacion(UtilDate.getPrimerDiaDelProximoMes(new Date()));
						service.insertComercializcionPackVO(comercializacionPackNew);
						guardarFrioCalorSucursal(comercializacionPackOld.getComercializacionPackId(), Constante.COMERCIALIZACION_PACK);
					}
				}				
				break;
			default:
				System.out.println("Error en la base de datos, datos corruptos");	
				break;
			}
		}else{
			System.out.println("No se pudo asignar la comercializacion");
		}		
		return "sujetoEmpresaSucursalesList.xhtml?faces-redirect=true";
	}
	
	/**
	 * Asigna fisicamente a la sucursal los equipos que estan en la lista de equipos asignados
	 * 
	 * @param comercializacionId ID de la comercializacion creada
	 * @param tipoComercializacion (Comercializacion_Pack o Comercializacion_Mes_Vencido)
	 */
	private void guardarFrioCalorSucursal(long comercializacionId, String tipoComercializacion){
		if(equiposAsignados.size()>0){
			System.out.println("Cantidad de fc para asignar: "+equiposAsignados.size());
			service.assignEquiposSucursal2(getSucursal(), equiposAsignados,Constante.COMERCIALIZACION_PACK,comercializacionId);
		}
	}
	
	/**
	 * Obtiene la comercializacion del tipo pack de una sucursal
	 */
	private void getComercializacionPack(){
		SucursalServicio ss = new SucursalServicioImp();
		
		comercializaciones = ss.getComercializacionesPackBySucursal(getSucursal());
		
		if (comercializaciones != null){
			System.out.println("Tiene ninguna comercializacion pack " + comercializaciones.size());
			switch (comercializaciones.size()) {
			case 0:
				System.out.println("0 comercializaciones");
				comercializacionPackOld = new ComercializacionPackVO();
				comercializacionPackNew = new ComercializacionPackVO();
				equiposAsignados = new ArrayList<SucursalFrioCalorVO>();
				mostrarComercializacionVieja = false;
				break;
			
			case 1:
				System.out.println("1 comercializaciones");
				comercializacionPackNew = new ComercializacionPackVO();
				comercializacionPackOld = comercializaciones.get(0);
				mostrarComercializacionVieja = true;
				buscarEquiposAsignados();
				break;

			case 2:
				System.out.println("2 comercializaciones");
				for(ComercializacionPackVO cp: comercializaciones){
					if(cp.getFechaDesasignacion()== null){
						comercializacionPackNew = cp;
					}else {
						if(cp.getFechaAsignacion() != null){
							comercializacionPackOld = cp;
						}
					}
				}
				mostrarComercializacionVieja = true;
				buscarEquiposAsignados();
				break;
			default:
				System.out.println("Error en la base de datos, datos corruptos");	
				break;
			}
		}else {
			System.out.println("Devolvio null el metodo");
		}
	}
	
	//---------------
	
	//--- GET AND SET ---
	public List<FrioCalorVO> getEquiposFrioCalorDisponibles() {
		return equiposFrioCalorDisponibles;
	}

	public FrioCalorVO getSelectedFrioCalor() {
		return selectedFrioCalor;
	}

	public void setSelectedFrioCalor(FrioCalorVO selectedFrioCalor) {
		this.selectedFrioCalor = selectedFrioCalor;
	}

	public String getUbicacionFrioCalor() {
		return ubicacionFrioCalor;
	}

	public void setUbicacionFrioCalor(String ubicacionFrioCalor) {
		this.ubicacionFrioCalor = ubicacionFrioCalor;
	}

	public SucursalVO getSucursal() {
		return sucursal;
	}

	public String getTitulo() {
		return titulo;
	}

	public List<SucursalFrioCalorVO> getEquiposAsignados() {
		return equiposAsignados;
	}

	public List<FrioCalorVO> getFrioCalorFilter() {
		return frioCalorFilter;
	}

	public void setFrioCalorFilter(List<FrioCalorVO> frioCalorFilter) {
		this.frioCalorFilter = frioCalorFilter;
	}

	public ComercializacionPackVO getComercializacionPackOld() {
		return comercializacionPackOld;
	}

	public ComercializacionPackVO getComercializacionPackNew(){
		return comercializacionPackNew;	
	}
	
	public boolean getMostrarComercializacionVieja(){
		return mostrarComercializacionVieja;
	}

	//-------------------
	
	
}
